{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import tensorflow as tf\n",
    "import numpy as np\n",
    "from tensorflow.examples.tutorials.mnist import input_data\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Extracting MNIST_data/train-images-idx3-ubyte.gz\n",
      "Extracting MNIST_data/train-labels-idx1-ubyte.gz\n",
      "Extracting MNIST_data/t10k-images-idx3-ubyte.gz\n",
      "Extracting MNIST_data/t10k-labels-idx1-ubyte.gz\n"
     ]
    }
   ],
   "source": [
    "mnist = input_data.read_data_sets(\"MNIST_data/\", one_hot=True)\n",
    "trX, trY, teX, teY = mnist.train.images, mnist.train.labels, mnist.test.images, mnist.test.labels"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "class RBM(object):\n",
    "    def __init__(self, m, n):\n",
    "        \"\"\"\n",
    "        m: Number of neurons in visible layer\n",
    "        n: number of neurons in hidden layer\n",
    "        \"\"\"\n",
    "        self._m = m\n",
    "        self._n = n\n",
    "                \n",
    "        \n",
    "        \n",
    "        # Create the Computational graph\n",
    "       \n",
    "        # Weights and biases\n",
    "        self._W = tf.Variable(tf.random_normal(shape=(self._m,self._n)))\n",
    "        self._c = tf.Variable(np.zeros(self._n).astype(np.float32))  #bias for hidden layer\n",
    "        self._b = tf.Variable(np.zeros(self._m).astype(np.float32))  #bias for Visible layer\n",
    "            \n",
    "        # Placeholder for inputs\n",
    "        self._X = tf.placeholder('float', [None, self._m])\n",
    "                                               \n",
    "        # Forwards Pass\n",
    "        _h = tf.nn.sigmoid(tf.matmul(self._X, self._W) + self._c)\n",
    "        self.h = tf.nn.relu(tf.sign(_h - tf.random_uniform(tf.shape(_h))))\n",
    "                      \n",
    "            \n",
    "        #Backward pass\n",
    "        _v = tf.nn.sigmoid(tf.matmul(self.h, tf.transpose(self._W)) + self._b)\n",
    "        self.V = tf.nn.relu(tf.sign(_v - tf.random_uniform(tf.shape(_v))))\n",
    "                        \n",
    "                                              \n",
    "        # Objective Function\n",
    "        objective = tf.reduce_mean(self.free_energy(self._X)) - tf.reduce_mean(\n",
    "                              self.free_energy(self.V))\n",
    "        self._train_op =  tf.train.GradientDescentOptimizer(1e-3).minimize(objective)\n",
    "        \n",
    "        # Cross entropy cost\n",
    "        reconstructed_input = self.one_pass(self._X)\n",
    "        self.cost = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(\n",
    "                labels=self._X, logits=reconstructed_input))\n",
    "\n",
    "            \n",
    "            \n",
    "    def set_session(self, session):\n",
    "        self.session = session\n",
    "            \n",
    "                                   \n",
    "            \n",
    "    def free_energy(self, V):\n",
    "        b = tf.reshape(self._b, (self._m, 1))\n",
    "        term_1 = -tf.matmul(V,b)\n",
    "        term_1 = tf.reshape(term_1, (-1,))\n",
    "        \n",
    "        term_2 = -tf.reduce_sum(tf.nn.softplus(tf.matmul(V,self._W) + self._c))\n",
    "        return term_1 + term_2\n",
    "    \n",
    "    def one_pass(self, X):\n",
    "        h = tf.nn.sigmoid(tf.matmul(X, self._W) + self._c)\n",
    "        return tf.matmul(h, tf.transpose(self._W)) + self._b\n",
    "    \n",
    "    def reconstruct(self,X):\n",
    "        x = tf.nn.sigmoid(self.one_pass(X))\n",
    "        return self.session.run(x, feed_dict={self._X: X})\n",
    "        \n",
    "        \n",
    "        \n",
    "    def fit(self, X, epochs = 1, batch_size = 100):\n",
    "        N, D = X.shape\n",
    "        num_batches = N // batch_size\n",
    "        \n",
    "        obj = []\n",
    "        for i in range(epochs):\n",
    "            #X = shuffle(X)\n",
    "            for j in range(num_batches):\n",
    "                batch = X[j * batch_size: (j * batch_size + batch_size)]\n",
    "                _, ob = self.session.run([self._train_op,self.cost ], feed_dict={self._X: batch})\n",
    "                if j % 100 == 0:\n",
    "                    print('training epoch {0} batch {2} cost {1}'.format(i,ob, j)) \n",
    "                obj.append(ob)\n",
    "        return obj"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "training epoch 0 batch 0 cost 6.004464149475098\n",
      "training epoch 0 batch 100 cost 0.25257736444473267\n",
      "training epoch 0 batch 200 cost 0.21343500912189484\n",
      "training epoch 0 batch 300 cost 0.20747235417366028\n",
      "training epoch 0 batch 400 cost 0.18498995900154114\n",
      "training epoch 0 batch 500 cost 0.18456442654132843\n",
      "training epoch 1 batch 0 cost 0.17866669595241547\n",
      "training epoch 1 batch 100 cost 0.1647292673587799\n",
      "training epoch 1 batch 200 cost 0.159803107380867\n",
      "training epoch 1 batch 300 cost 0.16542433202266693\n",
      "training epoch 1 batch 400 cost 0.15586064755916595\n",
      "training epoch 1 batch 500 cost 0.15928760170936584\n",
      "training epoch 2 batch 0 cost 0.15671007335186005\n",
      "training epoch 2 batch 100 cost 0.14797250926494598\n",
      "training epoch 2 batch 200 cost 0.14541533589363098\n",
      "training epoch 2 batch 300 cost 0.15265730023384094\n",
      "training epoch 2 batch 400 cost 0.14485737681388855\n",
      "training epoch 2 batch 500 cost 0.15023769438266754\n"
     ]
    }
   ],
   "source": [
    "Xtrain = trX.astype(np.float32)\n",
    "Xtest = teX.astype(np.float32)\n",
    "_, m = Xtrain.shape\n",
    "\n",
    "rbm = RBM(m, 600)\n",
    "\n",
    "#Initialize all variables\n",
    "init = tf.global_variables_initializer()\n",
    "with tf.Session() as sess:\n",
    "    sess.run(init)\n",
    "    rbm.set_session(sess)\n",
    "    err = rbm.fit(Xtrain, epochs=3)\n",
    "    out = rbm.reconstruct(Xtest[0:100])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.text.Text at 0x21082743b70>"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\nQvx/HvwpXQZDihoAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x210805ee518>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(err)\n",
    "plt.xlabel('epochs')\n",
    "plt.ylabel('cost')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x210828bfac8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plotting original and reconstructed images\n",
    "row, col = 2, 8\n",
    "idx = np.random.randint(0, 100, row * col // 2)\n",
    "f, axarr = plt.subplots(row, col)\n",
    "\n",
    "j, k = 0,0\n",
    "for i in idx:\n",
    "    axarr[j,k].imshow(Xtest[i].reshape(28,28))\n",
    "    axarr[j,k+1].imshow(out[i].reshape(28,28))\n",
    "    k = k+2\n",
    "    if k==col:\n",
    "        j,k=1, 0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    ""
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python [conda env:tf-gpu-1p3]",
   "language": "python",
   "name": "conda-env-tf-gpu-1p3-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3.0
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}